Factory.create   B
last analyzed

Complexity

Conditions 1
Paths 16

Size

Total Lines 35

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 16
nop 1
dl 0
loc 35
rs 8.8571
c 0
b 0
f 0
1
var Sinon = require('sinon')
2
3
var Objects = require('../Utility/index').Objects
4
var Defaults = require('./GlobalDefaults')
5
6
/**
7
 * @namespace
8
 */
9
var Factory = {
10
  /**
11
   * @param {string} symbol
12
   * @param {TStubSettings} settings
13
   * @return {IStub}
14
   */
15
  create: function (symbol, settings) {
16
    var mock = function (configuration) {
17
      var self = this
18
      this.name = symbol
19
20
      this._setup = function (configuration) {
21
        var buffer = Objects.merge(Defaults, settings.defaults)
22
        buffer = Objects.merge(buffer, configuration || {})
23
        self._settings = buffer
24
      }
25
26
      this._reset = function () {
27
        self._state = Objects.copy(settings.state || {})
28
        var properties = settings.properties || {}
29
        Object.keys(properties).forEach(function (name) {
30
          self[name] = properties[name]
31
        })
32
        var handlers = settings.handlers || {}
33
        Object.keys(handlers).forEach(function (name) {
34
          self[name] = Sinon.spy(function () {
35
            var args = Array.prototype.slice.call(arguments)
36
            args.unshift(self)
37
            return handlers[name].apply(this, args)
38
          })
39
        })
40
      }
41
42
      this._flush = function () {
43
        if (typeof settings.onFlush === 'function') {
44
          settings.onFlush(self)
45
        }
46
      }
47
48
      this._setup(configuration)
49
      this._reset()
50
    }
51
    Object.defineProperty(mock, 'name', {value: symbol, writable: false})
52
    return mock
53
  }
54
}
55
56
module.exports = {
57
  Factory: Factory
58
}
59